/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package simulateurs.interpreteur;

import simulateurs.model.monde.Arene;
import simulateurs.model.monde.Equipe;
import simulateurs.model.monde.Robot;
import simulateurs.model.monde.Point;
import simulateurs.model.monde.Balle;
import simulateurs.model.automate.Automate;
import simulateurs.view.controllersView.ButtonsPanelView;

import java.io.File;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import simulateurs.model.automate.CondBoole;

/**
 *
 * @author Abu Yuunus
 */
public class ParserXML {
    
    protected ArrayList<Equipe> equipeList=null;
    protected ArrayList<Balle> balleList=null;
    
    public void setListEquipe(ArrayList<Equipe> equipeList){
        this.equipeList=equipeList;
    }
    
    public ArrayList<Equipe> getListEquipe(){
        return equipeList;
    }
    
    public void setListBalle(ArrayList<Balle> balleList){
        this.balleList=balleList;
    }
    
    public ArrayList<Balle> getListBalle(){
        return balleList;
    }
    
    public ParserXML (ArrayList<Equipe> equipeList,ArrayList<Balle> balleList){
        
        setListEquipe(equipeList);
        setListBalle(balleList);
        
    }
    
    public ParserXML(String donneesInitiales){
        
        try{
            parserXML(donneesInitiales);
            
        }catch(Exception err){
            System.out.println("Erreur");
        }
    }
    
    public void parserXML(String donneesInitiales) throws Exception {
        
        List team;
        List rbt;
        List comp;
        List auto;
        List trans;
        List condi;
      
        int duree;
        String mode=null;
        String valTps=null;
        String condarene=null;
        
        String nom=null;
        String color;
        String flag=null;
        
        String type=null;
        String number=null;
        String taille=null;
        String rayon=null;
        String vision=null;
        String vitesse=null;
       
        String dir=null;
       
        
        String att=null;
        
        String val=null;
        
        String num=null;
        String ray=null;
       
        String val1=null;
        String val2=null;
        String val3=null;
        String val4=null;
       
        String bool=null;
        
        boolean bon;
        boolean test;
        String bonus=null;
        
        Color co=null;
        
        ArrayList<Automate> automateList = null;
        ArrayList<CondBoole> uneTransition = null;
        
        Automate automateTmp = null;
        
        //Arene arene=new Arene();
        Equipe equipe=new Equipe();
        Robot rb=new Robot();
        
        
        SAXBuilder sb=new SAXBuilder();
        Document doc=sb.build(donneesInitiales);
        
        Element root=doc.getRootElement();
        
        System.out.println("Le jeu simulateur:");
        System.out.println("La racine du fichier est :" + root.getName());
        
        Element aine=root.getChild("Arene");
        System.out.println("    Les dimensions de l'arene : la hauteur est "+aine.getAttributeValue("hauteur") + " et la largeur est" + aine.getAttributeValue("largeur"));
        
        condarene=aine.getAttributeValue("condition");
        
        Element listeEquipe = root.getChild("Liste_Equipe");
        team = listeEquipe.getChildren("Equipe");
        
        //arene.setListeEquipes(new ArrayList<Equipe>());
        //arene.setListeBalles(new ArrayList<Balle> () );
        setListEquipe(new ArrayList<Equipe>());
        setListBalle(new ArrayList<Balle> () );
        
        
        
        for(int i=0;i<team.size();i++)
        {
            
            Element element=(Element)team.get(i);
            nom=element.getAttributeValue("nom");
            color=element.getAttributeValue("couleur");
            flag=element.getAttributeValue("drapeau");
            
            if(color.compareToIgnoreCase("bleu") ==0) co=Color.BLUE;
            if(color.compareToIgnoreCase("vert")==0) co=Color.GREEN;
            if(color.compareToIgnoreCase("jaune") ==0) co=Color.YELLOW;
            if(color.compareToIgnoreCase("magenta")==0) co=Color.MAGENTA;
            if(color.compareToIgnoreCase("cyan") ==0) co=Color.CYAN;
            if(color.compareToIgnoreCase("orange")==0) co=Color.ORANGE;
            if(color.compareToIgnoreCase("blanc") ==0) co=Color.WHITE;
            if(color.compareToIgnoreCase("noir") ==0) co=Color.BLACK;
            if(color.compareToIgnoreCase("rouge") ==0) co=Color.RED;
            if(color.compareToIgnoreCase("rose") ==0) co=Color.PINK;
            if(color.compareToIgnoreCase("gris") ==0) co=Color.GRAY;
            
            System.out.println("         Equipe name:"+nom);
            System.out.println("             le drapeau:"+flag);
            System.out.println("             couleur:"+color);
            System.out.println("-------------------------------------------------------------------------------");
            
            
            rbt = element.getChildren("Robot");
            equipe = new Equipe();
            equipe.setListeRobots(new ArrayList<Robot> ());
            for(int j=0;j<rbt.size();j++)
            {
                // il parcours seulement deux fois 
                // une boucle selon le nombre de robots !
                Element el=(Element)rbt.get(j);
                number=el.getAttributeValue("nombre");
                
                for(int compteur1 =0;compteur1<Integer.parseInt(number);compteur1++){
                    
                
                
                
                
                type=el.getAttributeValue("type");
                
                taille=el.getAttributeValue("tailleAbsolue");
                rayon=el.getAttributeValue("diametre");
                vision=el.getAttributeValue("vision");
                vitesse=el.getAttributeValue("vitesse");
                dir=el.getAttributeValue("direction");
          
                
                System.out.println("         Robot de type:"+type+"; nombre de robot="+number+"; taille =:"+taille+"; rayon="+rayon+" ;champs de vision="+vision+" ;vitesse="+vitesse+";direction="+dir);
                
                comp = el.getChildren("Comportement");
                for (int k=0; k<comp.size(); k++)
                {
                    
                    Element e=(Element)comp.get(k);
                    auto = e.getChildren("Automate");
                    att=e.getChild("Automate").getAttributeValue("ID");
                    System.out.println("        Automate de type "+att);
                    
                    // ArrayList<Automate> automateList
                    automateList = new ArrayList<Automate>();
                    
                    for (int l = 0; l<auto.size(); l++)
                    {
                        automateTmp = new Automate();
                        Element et=(Element)auto.get(l);
                        trans = et.getChildren("TransAct");
                        
                        for(int m=0; m<trans.size();m++)
                        {
                            // il faut recuperer les atributs de transact
                            // il manque la recuperation de l'etat initial
                            
                            
                            Element em=(Element)trans.get(m);
                            condi=em.getChildren("Condition");
                            //System.out.println("           Les transitions de l'automate:"+em.getAttributeValue("EtatInit")+" "+ em.getAttributeValue("EtatSuiv") +" "+ em.getAttributeValue("Action"));
                            
                            
                            Element en1=(Element)trans.get(m);
                            val2=en1.getAttributeValue("EtatInit");
                            System.out.println("\n                EtatInit: "+ val2);
                            
                            Element en2=(Element)trans.get(m);
                            val3=en2.getAttributeValue("EtatSuiv");
                            System.out.println("                EtatSuiv: "+ val3);
                            
                            Element en3=(Element)trans.get(m);
                            val4=en3.getAttributeValue("Action");
                            System.out.println("                Action: "+ val4);
                            // fin de la recuperation des attributs
                            
                            
                            uneTransition = new ArrayList<CondBoole>();
                            
                            for(int n=0; n<condi.size(); n++){
                                
                                Element en=(Element)condi.get(n);
                                val=en.getAttributeValue("valeur");
                                System.out.println("                Les conditions de l'automate: "+ val);
                                
                                Element eg=(Element)condi.get(n);
                                bool=eg.getAttributeValue("booleen");
                                System.out.println("                true / false : "+ bool);
                                
                                if(bool.compareToIgnoreCase("vrai") == 0){
                                    bool = "true";
                                }
                                else if (bool.compareToIgnoreCase("faux") == 0){
                                    bool = "false";
                                }
                                else
                                {
                                    System.out.println("Un booleen c'est vrai ou faux !!!");
                                }
                                
                                // il faut ajouter a la liste de condbool, listeCondBoole.add(new CondBoole(...))
                                
                                // il faut une liste de conditions ???
                                
                                uneTransition.add(new CondBoole(val,Boolean.valueOf(bool)));
                                
                            }
                            
                            // il faut remplir l'automate !!!
                            // FAUX : automate = Automate.ajouterTransitionEtc(ArrayList<CondBoole> transition) // doit faire un new dedans
                            
                            
                            
                            automateTmp.RemplirUneLigneAutomate(uneTransition ,val2, val3, val4); // doit faire un new dedans
                       
                            
                        }
                        automateTmp.afficher();
                         System.out.println("--FIN DE L'AFFICHAGE DE L'AUTOMATE--\n");

                        automateList.add(automateTmp);
                        
                        
                        System.out.println("-------------------------------------------------------------------------------");
                        System.out.println("-------------------------------------------------------------------------------");
                    }
                    // initialise l'automate du robot
                    
                    // robot.setListAutomate(automateList) NON
                    // what about le robot
                    
                    
                    
                }
                
                System.out.println(rayon);
                System.out.println(dir);
                System.out.println(vision);
                System.out.println(vitesse);
                if(equipe.getListeRobots() != null){
                    System.out.println("la liste des robots de l'equipe n'est pas null");
                }
                else{
                    System.out.println("la liste des robots de l'equipe EST null");
                }
                //equipe.getListeRobots().add(new Robot(new Point(Double.parseDouble(po1),Double.parseDouble(po2)),Double.parseDouble(rayon),null,null,Integer.parseInt(dir),Integer.parseInt(vision),Integer.parseInt(tpsCache),Double.parseDouble(vitesse)));
                
                Equipe eqq = new Equipe(); ///astuce pour initialisé l'equipe dans robot plus tard
                // ArrayList<Automate> autolist=null;
                // L'AUTOMATE n'est pas rempli
                
                // probleme la liste des robots de l'equipe est null
                // IL FAUDRA enlever le point dans le robot
                //equipe.getListeRobots().add(new Robot(new Point(1.,2.),3.,eqq,automateList,90,3,4,5.,co));
                
                
                // ajout d'un robot a l'equipe
                                System.out.println("La taille de la liste des robots de l'equipe courant AVANT est : " +  equipe.getListeRobots().size());

               // equipe.getListeRobots().add(new Robot(new Point(Double.parseDouble(po1),Double.parseDouble(po2)),Double.parseDouble(rayon),eqq,automateList,Integer.parseInt(dir),Integer.parseInt(vision),Integer.parseInt(tpsCache),Double.parseDouble(vitesse),co));
                 equipe.getListeRobots().add(new Robot(Double.parseDouble(rayon),eqq,automateList,Integer.parseInt(dir),Integer.parseInt(vision),Double.parseDouble(vitesse),co));
                
                // affichage de la taille de la liste de robots
                System.out.println("La taille de la liste des robots de l'equipe courant est : " +  equipe.getListeRobots().size());
                
                // la taille de la liste des robots doit grossir
                
                equipe.getListeRobots().get(equipe.getListeRobots().size() - 1).getAutomates().get(0).afficher();
                System.out.println("--FIN DE L'AFFICHAGE DE L'AUTOMATE VIA EQUIPE--\n");

                
                System.out.println("saluttt");
                }
            }
            
            
            // ILLOGIQUE !!!!!!!
            
           
            
            
            
            // equipe.getListeRobots().add(new Robot());
            System.out.println(co+"lalalalal");
            //arene.getListeEquipes().add( new Equipe(nom,co,null, flag, null));
            getListEquipe().add( new Equipe(nom,co,equipe.getListeRobots(), flag, null));
            
            
            for(int z=0; z<equipe.getListeRobots().size(); z++){
                
                getListEquipe().get(getListEquipe().size()-1).getListeRobots().get(z).setEquipe(getListEquipe().get(getListEquipe().size()-1));
            }
            
            
        }
        
        System.out.println("--------------------------------------------------------------------------------");
        
        Element listeBalle=root.getChild("Liste_Balle");
        List ball=listeBalle.getChildren("Balle");
        
        for (int i=0; i<ball.size(); i++)
        {
            Element element=(Element)ball.get(i);
            num=element.getAttributeValue("nombre");
            
            color=element.getAttributeValue("couleur");
            ray=element.getAttributeValue("diametre");
           // ca=element.getAttributeValue("centr_abs");
           // cod=element.getAttributeValue("centr_ord");
            val1=element.getAttributeValue("va");
            bonus=element.getAttributeValue("apport");
            
            if(bonus.compareToIgnoreCase("rien")==0) bon=false;
            else{ bon=true;}
            
           // rep=element.getChild("repartition-initial").getAttributeValue("rep");
            
            System.out.println("Les caracterisques de la balle : il y a "+num+" balles de couleur "+color+" le rayon de la balle est: "+ray);
            System.out.println("     L'equipe a marque "+val1+" buts" + " et de bonus "+bonus);
          //  System.out.println("     Il y avait "+rep+" balles au debut du jeu");
            System.out.println("     ------------------------------");
            
            if(color.compareToIgnoreCase("bleu") ==0) co=Color.BLUE;
            if(color.compareToIgnoreCase("vert")==0) co=Color.GREEN;
            if(color.compareToIgnoreCase("jaune") ==0) co=Color.YELLOW;
            if(color.compareToIgnoreCase("magenta")==0) co=Color.MAGENTA;
            if(color.compareToIgnoreCase("cyan") ==0) co=Color.CYAN;
            if(color.compareToIgnoreCase("orange")==0) co=Color.ORANGE;
            if(color.compareToIgnoreCase("blanc") ==0) co=Color.WHITE;
            if(color.compareToIgnoreCase("noir") ==0) co=Color.BLACK;
            if(color.compareToIgnoreCase("rouge") ==0) co=Color.RED;
            if(color.compareToIgnoreCase("rose") ==0) co=Color.PINK;
            if(color.compareToIgnoreCase("gris") ==0) co=Color.GRAY;           
            if(color.compareToIgnoreCase("rose") ==0) co=Color.PINK;
            if(color.compareToIgnoreCase("gris") ==0) co=Color.GRAY;
            
            //System.out.println(ca);
       // System.out.println(cod);
        System.out.println(val1);
        System.out.println(bonus);
        System.out.println(co);
        
        for(int l = 0; l<Integer.parseInt(num);l++){
           // getListBalle().add(new Balle( new Point(Double.parseDouble(ca),Double.parseDouble(cod)),Double.parseDouble(ray),Integer.parseInt(val1),co,bonus));
            getListBalle().add(new Balle(Double.parseDouble(ray),Integer.parseInt(val1),co,bon));
        }
         
            
        }
        
        
        //arene.getListeBalles().add(new Balle( new Point(Double.parseDouble(ca),Double.parseDouble(cod)),Double.parseDouble(ray),Integer.parseInt(val1),co));
        
        System.out.println("tralala");
        
        Element regle=root.getChild("Regle");
        mode=regle.getAttributeValue("mode");
        valTps=regle.getAttributeValue("valeurtps");
        
        
       if(mode.compareToIgnoreCase("temps")==0) test=true;
            else{ test=false;}
        
    }
        
 }
        
        

